package ar.edu.uade.fain.ad.test.server.dao.hibernate;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.persistence.PersistenceException;

import org.hibernate.HibernateException;
import org.hibernate.Session;

import ar.edu.uade.fain.ad.test.server.business.CoordinadorBO;
import ar.edu.uade.fain.ad.test.server.business.IntegranteBO.SexoBO;
import ar.edu.uade.fain.ad.test.server.dao.CoordinadorDAO;
import ar.edu.uade.fain.ad.test.server.entity.Coordinador;
import ar.edu.uade.fain.ad.test.server.entity.Integrante.Sexo;

public class CoordinadorHibernateDAO implements CoordinadorDAO {

	@Override
	public List<CoordinadorBO> buscarCoordinadores(
			SexoBO sexoBO, Set<String> funciones) {
		final Session session = HibernateUtil.get().openSession();
		session.beginTransaction();
		try {
			Sexo sexo = null;
			if (sexoBO.equals(SexoBO.MASCULINO)) {
				sexo = Sexo.MASC;
			} else if (sexoBO.equals(SexoBO.FEMENINO)) {
				sexo = Sexo.FEME;
			}
			@SuppressWarnings("unchecked")
			final List<Coordinador> entities = 
					session.getNamedQuery("coordinador.enProyectoConFunciones")
							.setParameterList("funciones", 
									new ArrayList<String>(funciones))
							.setParameter("sexo", sexo)
							.list();
			final ArrayList<CoordinadorBO> bos = new ArrayList<CoordinadorBO>();
			for (Coordinador entity : entities) {
				bos.add(map(entity));
			}
			session.close();
			return bos;
		} catch (HibernateException he) {
			throw new PersistenceException(he);
		}
 	}

	private CoordinadorBO map(Coordinador entity) {
		final CoordinadorBO bo = new CoordinadorBO();
		bo.setId(entity.getId());
		bo.setInterino(entity.isInterino());
		bo.setNombre(entity.getNombre());
		bo.setSexo(entity.getSexo().equals(Sexo.MASC) ? 
				SexoBO.MASCULINO : SexoBO.FEMENINO);
		return bo;
	}

}
